"""
安全工具模块
提供密码哈希、验证和JWT令牌生成等安全相关功能
"""
from passlib.context import CryptContext
from jose import JWTError, jwt
from datetime import datetime, timedelta
from typing import Optional

# 密码加密上下文，使用bcrypt算法
pwd_context = CryptContext(schemes=["bcrypt"], deprecated="auto")

# JWT配置
SECRET_KEY = "your-secret-key"  # 生产环境应使用环境变量配置
ALGORITHM = "HS256"  # JWT加密算法
ACCESS_TOKEN_EXPIRE_MINUTES = 30  # 默认访问令牌过期时间


def verify_password(plain_password: str, hashed_password: str) -> bool:
    """
    验证密码
    比较明文密码和哈希密码是否匹配
    
    Args:
        plain_password (str): 明文密码
        hashed_password (str): 哈希后的密码
        
    Returns:
        bool: 密码是否匹配
    """
    return pwd_context.verify(plain_password, hashed_password)


def get_password_hash(password: str) -> str:
    """
    获取密码哈希值
    将明文密码转换为安全的哈希值
    
    Args:
        password (str): 明文密码
        
    Returns:
        str: 哈希后的密码
    """
    return pwd_context.hash(password)


def create_access_token(data: dict, expires_delta: Optional[timedelta] = None) -> str:
    """
    创建访问令牌
    生成JWT格式的访问令牌
    
    Args:
        data (dict): 要编码到令牌中的数据
        expires_delta (Optional[timedelta], optional): 过期时间增量，默认15分钟
        
    Returns:
        str: JWT格式的访问令牌
    """
    # 复制数据，避免修改原始数据
    to_encode = data.copy()
    
    # 设置过期时间
    if expires_delta:
        expire = datetime.utcnow() + expires_delta
    else:
        expire = datetime.utcnow() + timedelta(minutes=15)
    
    # 添加过期时间到编码数据
    to_encode.update({"exp": expire})
    
    # 生成JWT令牌
    encoded_jwt = jwt.encode(to_encode, SECRET_KEY, algorithm=ALGORITHM)
    
    return encoded_jwt